﻿using System;
// 委托和接口
// 能用委托解决的问题，都可以用接口解决。

namespace _086_委托和接口
{
    //例如：下面的ITransformer接口可以解决上面的“过滤”问题：
    public interface ITransformer
    {
        int Transform(int x);
    }
    public class Util
    {
        public static void TransformAll(int[] values, ITransformer t)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = t.Transform(values[i]);
            }
        }
    }
    class Squarer : ITransformer
    {
        public int Transform(int x) { return x * x; }
    }
    //虽然在ITransformer实例中我们不需要多播。但接口内只定义了一个方法。而且订阅者有可能为了支持不同的转换（如平方或立方转换），需要多次实现ITransformer接口。
    //如果使用接口，由于Test类只能实现依次ITransformer，必须为每种转换分别写一个类。这样会很麻烦：
    class Cuber:ITransformer
    {
        public int Transform(int x) { return x * x * x; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            int[] values = { 1, 2, 3 };
            Util.TransformAll(values, new Squarer());
            foreach (int i in values)
            {
                Console.WriteLine(i);
            }


            int[] valuesC = { 1, 2, 3 };
            Util.TransformAll(valuesC, new Cuber());
            foreach(int i in valuesC)
            {
                Console.WriteLine(i);
            }

            Console.ReadKey();
        }
    }
}
/*
 
在下面的情形中，委托可能是比接口更好的选择：
    接口内只能定义一个方法
    需要多播能力
    订阅者需要多次实现接口
 
 */